package reflex.learning02;

import org.junit.Test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @program JavaBase
 * @description:
 * @author: zhanglu
 * @create: 2019-06-07 22:39:00
 */
public class TestField {

    /**
     * 获取对应的运行时类的属性
     * 获取修饰符 变量类型 变量名
     * 获取属性的各个部分的内容
     */
    @Test
    public void test01(){
        Class clazz = Person.class;
        Field[] fs1 = clazz.getDeclaredFields();
        System.out.println("111");
        for (Field f : fs1){
            //获取那个属性的权限修饰符
            int i = f.getModifiers();
            String str = Modifier.toString(i);
            System.out.println(i);
            System.out.println(str);
            //获取属性的变量类型
            Class type = f.getType();
            System.out.println(type.getName());
            //获取属性名
            System.out.println(f.getName());
        }
    }

    /**
     * 调用运行时类中指定的属性
     */
    @Test
    public void test02() throws Exception{
        Class clazz = Person.class;
        Person p = (Person) clazz.newInstance();
        Field f1 = clazz.getDeclaredField("name");
        f1.setAccessible(true);
        f1.set(p,"张三李四");
        System.out.println(p);

        //调用无参方法
        Method m1 =  clazz.getMethod("show");
        m1.invoke(p);

        //获取private 带参数的方法
        Method m2 =  clazz.getDeclaredMethod("disPlay", String.class);
        m2.setAccessible(true);
        m2.invoke(p, "CNN");

        //获取private 带参数的方法
        Method m4 =  clazz.getDeclaredMethod("disPlay", List.class, Map.class);
        m4.setAccessible(true);
        Map<String,Object> m = new HashMap<>();
        m.put("a", 1);
        m.put("b", 2);
        m4.invoke(p, Arrays.asList("CC","CN"), m);

        //调用静态方法
        Method m3 = clazz.getMethod("info");
        m3.invoke(clazz);
    }

}
